package com.xyc.javase.collectiontest;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @Version 1.0
 * @Author:徐衍程
 * @Date:2022/5/27
 * @Content:
 */
public class ArrayListTest {
    public static void main(String[] args) {
        //交集、并集、差集
        dealListData();
        //Arrays.asList()是泛型方法，传递的数组必须是对象数组，而不是基本类型
        arrayAsList();
        //Array转arrayList
        arrayToarrayList();
        //arrayList转Array
        arrayListToArray();
    }

    private static void arrayListToArray() {
        String [] s= new String[]{
                "dog", "lazy", "a", "over", "jumps", "fox", "brown", "quick", "A"
        };
        List<String> list = Arrays.asList(s);
        Collections.reverse(list);
        //没有指定类型的话会报错
        //toArray(T[] array) 方法的参数是一个泛型数组，如果 toArray 方法中没有传递任何参数的话返回的是 Object类 型数组。
        //由于 JVM 优化，new String[0]作为Collection.toArray()方法的参数现在使用更好，new String[0]就是起一个模板的作用，指定了返回数组的类型，0 是为了节省空间，因为它只是为了说明返回的类型。
        s = list.toArray(new String[0]);

    }

    private static void arrayToarrayList() {
        //方法一：new ArrayList<>
        List list = new ArrayList<>(Arrays.asList("a", "b", "c"));
        //方法二：stream
        Integer [] myArray = { 1, 2, 3 };
        List myList = Arrays.stream(myArray).collect(Collectors.toList());
        //基本类型也可以实现转换（依赖boxed的装箱操作）
        int [] myArray2 = { 1, 2, 3 };
        List myList2 = Arrays.stream(myArray2).boxed().collect(Collectors.toList());
    }

    private static void arrayAsList() {
        //数组必须是对象数组，而不是基本类型
//        int[] myArray = {1, 2, 3};
        Integer[] myArray = {1, 2, 3};
        List myList = Arrays.asList(myArray);
        System.out.println(myList.size());//int为1，Integer为3
        System.out.println(myList.getClass());//class java.util.Arrays$ArrayList
        System.out.println(myList.get(0));//int数组地址值，Integer为1
        int[] array = (int[]) myList.get(0);
        System.out.println(array[0]);//1
        System.out.println(myList.get(1));//报错：ArrayIndexOutOfBoundsException
        //使用集合的修改方法: add()、remove()、clear()会抛出异常
        myList.add(4);//运行时报错：UnsupportedOperationException
        myList.remove(1);//运行时报错：UnsupportedOperationException
        myList.clear();//运行时报错：UnsupportedOperationException

    }

    private static void dealListData() {
        ArrayList<Integer> a = new ArrayList<Integer>();
        ArrayList<Integer> b = new ArrayList<Integer>();
        a.add(1);
        a.add(2);
        a.add(3);
        a.add(4);
        b.add(3);
        b.add(4);
        b.add(5);
        b.add(6);
        //并集
        for (int k = 0; k < b.size(); k++) {//并集第一种方式
            a.add(b.get(k));
        }
        //a.addAll(b);并集第二种方式
        System.out.println("并集：");
        for (int n = 0; n < a.size(); n++) {
            System.out.print(a.get(n) + " ");
        }
        System.out.println( );
        //交集
        a.retainAll(b);
        System.out.println("交集：");
        for (int n = 0; n < a.size(); n++) {
            System.out.print(a.get(n) + " ");
        }
        System.out.println( );
        //差集
        a.removeAll(b);
        System.out.println("a与b的差集：");
        for (int n = 0; n < a.size(); n++) {
            System.out.print(a.get(n) + " ");
        }
    }
}
